/*
    created: 2023/4/9
    filename: forward_list.h
    author: 李东霖
    purpose: 单链表的声明和操作的声明
*/
#ifndef _FORWARD_LIST_H_
#define _FORWARD_LIST_H_

typedef int ElemType;

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

//单链表的定义   
//这里使用一个头结点，该头结点不保存值
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;

//声明操作  

//初始化链表，失败返回NULL成功返回链表的头结点，该结点不存放数据
LNode* InitList1();

//传入指针的地址的初始化方法  
int InitList2(LinkList* phead);

//销毁链表
void DestroyList(LinkList *phead);

//清空链表  
void ClearList(LinkList head);

//获得链表的长度 返回值 -1-链表为NULL >=0-链表长度 
int LengthList(LinkList head);

//在链表的第pos个位置插入元素elem 返回值：0-失败 1-成功  
int InsertList(LinkList head,unsigned int pos, ElemType *elem);

//在链表头部插入元素elem  返回值：0-失败 1-成功  
int Push_Front(LinkList head,ElemType *elem);

//在链表尾部插入元素elem  返回值：0-失败 1-成功  
int Push_Back(LinkList head,ElemType *elem);

//打印链表中的全部元素  
void DispList(LinkList head);

//删除链表中的第pos个结点 返回值0-失败,pos不合法 1-成功
int DeleteNode(LinkList head,unsigned int pos);

//删除链表的头结点 返回值0-失败,链表是空的 1-成功
int Pop_Front(LinkList head);

//删除链表的尾结点 返回值0-失败,链表是空的 1-成功
int Pop_Back(LinkList head);

//判断链表是否为空 返回值：1-空 0-非空
int Is_Empty(LinkList head);

//获取链表第pos个结点，成功返回该结点，失败返回NULL
LNode* LocateNode(LinkList head,unsigned int pos);

//查找元素elem在链表中的位置 没有找到该元素返回NULL，否则返回该结点   
LNode* LocateElem(LinkList head,ElemType *elem);

//在指定结点pp之前插入元素elem 返回值：0-失败 1-成功
int InsertPriorNode(LNode *pp,ElemType *elem);

//在指定结点pp之后插入元素elem 返回值：0-失败 1-成功
int InsertNextNode(LNode *pp,ElemType *elem);

//删除指定的结点  存在一定的问题  
int DeleteOneNode(LNode *pp);

//归并排序，将传入的两个链表合并为一个新链表(升序)  
int MergeList(LinkList La,LinkList Lb,LinkList Lc);

// 把链表pp结点之后的结点原地逆置（反转），返回值：0-失败；1-成功。
void ReverseList(LNode *pp);


#endif //!_FORWARD_LIST_H_